home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Practical Algorithms for Image Analysis
/
Practical Algorithms for Image Analysis.iso
/
CH_6.1
/
XVOR
/
HEAP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-11
|
2KB
|
123 lines
/*
* heap.c
*
* Practical Algorithms for Image Analysis
*
* Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
*/
/*
* HEAP.C
*
*/
#include <stdlib.h>
#include "vor.h"
void
PQinsert (he, v, offset)
struct Halfedge *he;
struct Site *v;
float offset;
{
struct Halfedge *last, *next;
he->vertex = v;
ref (v);
he->ystar = (float) (v->coord.y + offset);
last = &PQhash[PQbucket (he)];
while ((next = last->PQnext) != (struct Halfedge *) NULL &&
(he->ystar > next->ystar ||
(he->ystar == next->ystar && v->coord.x > next->vertex->coord.x))) {
last = next;
}
he->PQnext = last->PQnext;
last->PQnext = he;
PQcount += 1;
}
void
PQdelete (he)
struct Halfedge *he;
{
struct Halfedge *last;
if (he->vertex != (struct Site *) NULL) {
last = &PQhash[PQbucket (he)];
while (last->PQnext != he)
last = last->PQnext;
last->PQnext = he->PQnext;
PQcount -= 1;
deref (he->vertex);
he->vertex = (struct Site *) NULL;
}
}
int
PQbucket (he)
struct Halfedge *he;
{
int bucket;
bucket = (int) ((he->ystar - ymin) / deltay * PQhashsize);
if (bucket < 0)
bucket = 0;
if (bucket >= PQhashsize)
bucket = PQhashsize - 1;
if (bucket < PQmin)
PQmin = bucket;
return (bucket);
}
int
PQempty ()
{
return (PQcount == 0);
}
struct Point
PQ_min ()
{
struct Point answer;
while (PQhash[PQmin].PQnext == (struct Halfedge *) NULL) {
PQmin += 1;
}
answer.x = PQhash[PQmin].PQnext->vertex->coord.x;
answer.y = PQhash[PQmin].PQnext->ystar;
return (answer);
}
struct Halfedge *
PQextractmin ()
{
struct Halfedge *curr;
curr = PQhash[PQmin].PQnext;
PQhash[PQmin].PQnext = curr->PQnext;
PQcount -= 1;
return (curr);
}
void
PQinitialize ()
{
int i;
PQcount = 0;
PQmin = 0;
PQhashsize = 4 * sqrt_nsites;
PQhash = (struct Halfedge *) myalloc (PQhashsize * sizeof *PQhash);
for (i = 0; i < PQhashsize; i += 1)
PQhash[i].PQnext = (struct Halfedge *) NULL;
}